
console.log("---------------------------------------------原型继承---------------------------------------------------")
function SuperType() {
    this.property = true;
    console.log(this,"父类的this");
}

SuperType.prototype.getSuperValue = function() {
  return this.property;
};

function SubType() {
    this.subproperty = false;
    console.log(this,"子类的this");
}

//继承了SuperType
SubType.prototype = new SuperType();
SubType.prototype.getSubValue = function() {
    return this.subproperty;
};

var instance = new SubType();
console.log(instance.getSubValue()); // false
console.log(instance.getSuperValue()); // true
console.log(this)


function SuperColorType() {
    this.colors = ["red", "green", "blue"];
}

function SubColorType() {
    console.log(this.colors);
}

console.log(instance instanceof Object); //true
console.log(instance instanceof SuperType); //true
console.log(instance instanceof SubType); //true

console.log(Object.prototype.isPrototypeOf(instance)); //true
console.log(SuperType.prototype.isPrototypeOf(instance)); //true
console.log(SubType.prototype.isPrototypeOf(instance)); //true

console.log("------------------------------------------原型继承的缺点------------------------------------------")

//继承了SuperType
SubColorType.prototype = new SuperColorType();
var instance1 = new SubColorType();
instance1.colors.push("black");
console.log("sub",instance1.colors); //red,green,blue,black

var instance2 = new SubColorType();
console.log("sub",instance2.colors); //red,green,blue,black // SubColorType

var instance3 = new SuperColorType();
console.log("super",instance3.colors); // red,green,blue // SuperColorType

console.log("-----------------------------------------面试题---------------------------------------------------------")

// var a = new Object()
// var b = 2
// var c = function(){}
// var d = undefined
// var e = "jQuery"
// var f = true
// var g = []
// var h = {}
// var i = null
// console.log(typeof(a));
// console.log(typeof(b));
// console.log(typeof(c));
// console.log(typeof(d));
// console.log(typeof(e));
// console.log(typeof(f));
// console.log(typeof(g));
// console.log(typeof(h));
// console.log(typeof(i));
//
// console.log(null)


console.log("---------------------------------------判断js中的数据类型的几种方法----------------------------------------")
var a = "iamstring.";
var b = 222;
var c= [1,2,3];
var d = new Date();
var e = function(){console.log(111);};
var f = function(){this.name="22";};
// 1、最常见的判断方法：typeof
console.log(typeof a)   // string
console.log(typeof b)   // number
console.log(typeof c)   // object
console.log(typeof d)   // object
console.log(typeof e)   // function
console.log(typeof f)   // function
// 其中typeof返回的类型都是字符串形式，需注意，例如：
console.log(typeof a == "string") // true
console.log(typeof a == String) // false
// 另外typeof 可以判断function的类型；在判断除Object类型的对象时比较方便。
// 2、判断已知对象类型的方法： instanceof
console.log(c instanceof Array) -// true
console.log(d instanceof Date)
console.log(f instanceof Function) // true
// console.log(f instanceof function) // false
// 注意：instanceof 后面一定要是对象类型，并且大小写不能错，该方法适合一些条件选择或分支。
// 3、根据对象的constructor判断： constructor
console.log(c.constructor === Array) -// true
console.log(d.constructor === Date) // true
console.log(e.constructor === Function) // true
// 注意： constructor 在类继承时会出错
// eg：
function A(){};
function B(){};
A.prototype = new B(); //A继承自B
var aobj = new A();
console.log(aobj.constructor === B) // true;
console.log(aobj.constructor === A) // false;
// 而instanceof方法不会出现该问题，对象直接继承和间接继承的都会报true：
console.log(aobj instanceof A) // true;
console.log(aobj instanceof B) // true;
// 言归正传，解决construtor的问题通常是让对象的constructor手动指向自己：
aobj.constructor = A; //将自己的类赋值给对象的constructor属性
console.log(aobj.constructor === A) // true;
console.log(aobj.constructor === B) // false; //基类不会报true了;
// 4、通用但很繁琐的方法： prototype
console.log(Object.prototype.toString.call(a) === `[object String]`) // true;
console.log(Object.prototype.toString.call(b) === `[object Number]`) // true;
console.log(Object.prototype.toString.call(c) === `[object Array]`) // true;
console.log(Object.prototype.toString.call(d) === `[object Date]`) // true;
console.log(Object.prototype.toString.call(e) === `[object Function]`) // true;
console.log(Object.prototype.toString.call(f) === `[object Function]`) // true;
// 大小写不能写错，比较麻烦，但胜在通用。
// 5、无敌万能的方法：jquery.type()
// 如果对象是undefined或null，则返回相应的“undefined”或“null”。
// jQuery.type( undefined ) === "undefined"
// jQuery.type() === "undefined"
// jQuery.type( window.notDefined ) === "undefined"
// jQuery.type( null ) === "null"
// // 如果对象有一个内部的[[Class]]和一个浏览器的内置对象的 [[Class]] 相同，我们返回相应的 [[Class]] 名字。 (有关此技术的更多细节。 )
// jQuery.type( true ) === "boolean"
// jQuery.type( 3 ) === "number"
// jQuery.type( "test" ) === "string"
// jQuery.type( function(){} ) === "function"
// jQuery.type( [] ) === "array"
// jQuery.type( new Date() ) === "date"
// jQuery.type( new Error() ) === "error" // as of jQuery 1.9
// jQuery.type( /test/ ) === "regexp"
// 其他一切都将返回它的类型“object”。
console.log("------------------------------------------原型链及原型继承------------------------------------------------------------")

var Person = function () { };
Person.prototype.Say = function () {
    console.log("Person say");
}
Person.prototype.Salary = 50000;

var Programmer = function () { };
Programmer.prototype = new Person();
Programmer.prototype.WriteCode = function () {
    console.log("programmer writes code");
};

Programmer.prototype.Salary = 500;

var p = new Programmer();
p.Say();
p.WriteCode();
console.log(p.Salary);
console.log(p instanceof Person);
console.log(p instanceof Programmer);

